Flexible Initialization(灵活的初始化)
视频锁定
{$ currentTime | date:'mm:ss' $}
{$ timeLeft | date:'mm:ss' $}
就上上面提到的那样,如果你渴望有自己的初始化方法,调用该方法后返回的不是一个新对象而是某个现有的对象,那么你有两种方法去做这件事。 第一种方法是通过一个类方法比如new的方式,代码如下:
+ new
{
if (singleton == nil)
singleton = [[self alloc] init];
return singleton;
}
上述例子假定singleton对象已经存在。 如果你想用实例方法去实现比如用init,会稍微复杂一点,如下:
- init
{
if (singleton != nil)
{
RELEASE(self);
self = RETAIN(singleton);
}
else
{
singleton = self;
}
return self;
}
上述代码中,我们dealloc掉了当前的对象,并将我们希望用到的对象替换上去,不过你要小心init的返回值,请看下面代码:
id anObject = [SomeClass alloc];
[anObject init];
这样是有问题的,因为anObject对象可能已经被dealloc掉了,要用如下代码来代替:
anObject = [anObject init];
在实际应用中,也会发生初始化时需要返回一个现有对象的情况,比如NSConnection这个类。因为在两个网络端口上只允许有一条链接,所以如果你对已经有链接的端口调用如下方法initWithReceivePort:sendPort:时,这个方法会dealloc掉新的对象并将原来的对象返回给接收者。
通常情况下,还是用”new”的方法来完成这个工作比较稳妥,因为这样可以避免不必要的内存空间分配,但不是什么时候都可以用”new”来解决。
在线练习
{$ activeFileHint $}